import axios, { AxiosInstance, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
import { ElMessage } from 'element-plus';
import router from '../router/index.js';

const service: AxiosInstance = axios.create({
  baseURL: 'http://localhost:5185',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器（确保所有请求携带 Token）
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    const token = localStorage.getItem('token');
    // 强制为所有请求添加 Token（包括 PUT）
    if (token && config.headers) {
      config.headers.Authorization = `Bearer ${token}`;
      console.log('请求携带的 Token:', token.substring(0, 20) + '...'); // 调试用，确认 Token 存在
    } else {
      console.warn('未获取到 Token，可能导致请求失败');
    }
    return config;
  },
  (error) => {
    ElMessage.error('请求发送失败，请检查网络连接！');
    return Promise.reject(error);
  }
);

// 响应拦截器（精准判断错误类型）
service.interceptors.response.use(
  (response: AxiosResponse) => {
    const res = response.data;
    
    // 特殊接口处理
    if (response.config.url?.includes('/api/Auth/login') || 
        response.config.url?.includes('/api/Teacher/')||
        response.config.url?.includes('/api/Dishes')) {
      return res;
    }

    if (res.code !== 200) {
      ElMessage.error(res.message || '操作失败！');
      return Promise.reject(res);
    }
    return res;
  },
  (error) => {
    const errorMsg = error.response?.data?.message || '';
    const status = error.response?.status;
    const url = error.config?.url || '';

    // 只在明确是 Token 过期时才跳转登录
    const isTokenExpired = errorMsg.includes('token') && 
                          (errorMsg.includes('expired') || errorMsg.includes('无效'));

    if (status === 401 || isTokenExpired) {
      localStorage.removeItem('token');
      localStorage.removeItem('user');
      ElMessage.error('登录已过期或身份验证失败，请重新登录！');
      router.push(`/login?redirect=${router.currentRoute.value.fullPath}`);
      return Promise.reject(new Error('Token 无效或已过期'));
    }

    // 其他 400 错误（如数据验证失败），显示具体错误信息
    if (status === 400) {
      // 后端可能返回详细的验证错误（如 ValidationProblemDetails）
      const details = error.response?.data?.errors;
      let message = '数据验证失败：';
      
      if (details) {
        // 解析后端返回的字段验证错误
        Object.keys(details).forEach(key => {
          message += `${details[key].join('、')}；`;
        });
      } else {
        message = errorMsg || '请求参数错误，请检查输入';
      }
      
      ElMessage.error(message);
      return Promise.reject(new Error(message));
    }

    // 其他错误
    ElMessage.error(errorMsg || error.message || '网络异常！');
    return Promise.reject(error);
  }
);

export default service;